package com.sann.spring.factory;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 自己写的一个 Bean工厂
 *
 */
@Slf4j
public class BeanFactory{
    private static Properties props;
    private static Map<String, Object> beans;

    static {
        props = new Properties();
        // MYNOTICE  Web开发环境下，要想获取resource资源目录下的资源文件，最好的方式莫过于此
        InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
        try {
            props.load(in);
            // 下面是为获取单例对象进行的改造
            beans = new HashMap<>(10);
            // jdk1.0版本只有Enumeration 枚举
            Enumeration<Object> keys = props.keys();
            while (keys.hasMoreElements()) {
                String key = keys.nextElement().toString();

                String beanPath = props.getProperty(key);
                // 反射创建对象，存储到Map 容器中
                Class<?> clazz = Class.forName(beanPath);
                Object value = clazz.newInstance();
                log.info("工厂实例化：{}",value);

                // 把 Bean存储到容器Map中
                beans.put(key, value);
            }
            log.info("实例化容器中Bean完毕......");
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化properties失败");
        }
        //log.info("----------->factory: end static block...");
    }

    /**
     * 生产多例 Bean 对象
     * @param beanName
     * @return
     */
    public static Object getMulBean(String beanName){
        Object bean = null;
        try {
            String beanPath = props.getProperty(beanName);
            Class<?> clazz = Class.forName(beanPath);
            /*每次调用 getMulBean() 都是新实例化的一个对象，因此是多例的*/
            bean = clazz.newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return bean;
    }

    /**
     * 该方法返回的是单例 Bean 对象
     * @param name
     * @return
     */
    public static Object getSingletonBean(String name){
        Object obj = beans.get(name);
        return obj;
    }
}
